package com.qf.factoy;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @ClassName BeanFactory
 * @Description TODO
 * @Author 86181
 * @Date 2022/8/26 17:37
 * @Version 1.0
 **/

/**
 * 工厂类,用来获取对应的bean对象,通过加载配置文件读取配置信息
 * 在用反射的方法去初始化对象
 */
public class BeanFactory {
    private  static Properties properties;
    //工厂类加载的时候应该将对应的配置文件加载生成实例
    //在static代码块里面就要完成bean的初始化
    //生成的bean实例要存贮 集合
    private static Map<String,Object> beans;
    static {
        //获取输入流
        InputStream inputStream=
                BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
        properties = new Properties();
        try {
            properties.load(inputStream);
            //初始化map
            new HashMap<String,Object>();
            //properties本身就是一个mao,{k:v,k1:v2}  {"accountDao":"com.qf.dao.impl.AccountDaoImpl","accountService":""}
            //获取properties本身就是一个map所有的key
            Enumeration<Object> keys = properties.keys();
            //循环去获取指定key的value的值
            while (keys.hasMoreElements()){
                //获得key
                String key = keys.nextElement().toString();
                //获得value
                String value = properties.getProperty(key);
                //通过反射获取对应实例bean
                Object o = Class.forName(value).newInstance();
                //将对应的bean存储到容器中
                beans.put(key,o);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //获取bean的实例方法
    public  static Object getBean(String name){
        return beans.get(name);
        /**
         * String value=properties.getProperty(name);
         * //通过反射获取实例
         * //,多列,每次调用都会生成一个新的对象
         *         try {
         *             Object o = Class.forName(value).newInstance();
         *             return o;
         *         } catch (Exception e) {
         *             e.printStackTrace();
         *         }
         *         return null;
         */
    }
}
